//
//  arrayTraverseViewController.m
//  IOSDome
//
//  Created by 刘波 on 2019/4/27.
//  Copyright © 2019 clobe. All rights reserved.
//

#import "arrayTraverseViewController.h"

@interface arrayTraverseViewController ()

@end

@implementation arrayTraverseViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.view.backgroundColor = [UIColor whiteColor];
    


    [self setTraverse]; //数组遍历
    [self getArrayDate]; //数组排序
}


/**
 数组排序
 */
-(void)getArrayDate{
    NSArray *startArray = @[@(3),@(5),@(4),@(2),@(1),@(5),@(3)];
    
    //数组倒序
    NSLog(@"数组倒叙:%@",startArray.reverseObjectEnumerator.allObjects);
    
    //将数组转为集合 去重复
    NSSet *set = [NSSet setWithArray:startArray];
    NSLog(@"对数组去重后:%@",set);
    //输出为：5 1 2 3 4
    
    //把NSSet转NSArray
    NSArray *array =[set allObjects];
    // 对数组进行排序（升序）
    NSArray *resultAscending = [array sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        return [obj1 compare:obj2];
    }];
    NSLog(@"对数组进行排序（正序）：%@", resultAscending);
    //输出为：1 2 3 4 5
    // 对数组进行排序（降序）
    NSArray *resultDescending = [array sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        return [obj2 compare:obj1];
    }];
    NSLog(@"对数组进行排序（降序）：%@", resultDescending);
    //输出为：5 4 3 2 1
    
    
    
    
    NSArray *cityarr = [NSArray arrayWithObjects:@"上海",@"武汉",@"广州",@"成都",@"北京", nil];
    NSArray *resultArr = [cityarr sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        //str.lowercaseString 把字符串转写小写字母
        obj1 = [self firstCharactor:obj1];
        obj2 = [self firstCharactor:obj2];
        
        return [obj1 compare:obj2 options:NSNumericSearch];
    }];
    NSLog(@"对字母顺序进行排序（升序）：%@", resultArr);
    //输出为： 北京 成都 广州 上海 武汉
}



/**
 获取字符串首位字母
 */
- (NSString *)firstCharactor:(NSString *)aString
{
    //转成了可变字符串
    NSMutableString *str = [NSMutableString stringWithString:aString];
    //先转换为带声调的拼音
    CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformMandarinLatin,NO);
    //再转换为不带声调的拼音
    CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformStripDiacritics,NO);
    //转化为大写拼音
    NSString *pinYin = [str capitalizedString];
    //获取并返回首字母
    return [pinYin substringToIndex:1];
}


-(void)setTraverse{
    NSMutableArray *mArray = [NSMutableArray new];
    //生成包含10万元素的数组
    for (int i = 0; i<10000; i++) {
        [mArray addObject:[NSString stringWithFormat:@"%i",i]];
    }
    
    //经典for循环
    for (int i = 0; i<mArray.count; i++) {
        NSLog(@"%@",mArray[i]);
    }
    /**
     * 优点：被广泛使用，容易接受，操作简单
     * 缺点：遍历字典和集合比较繁琐，会占用太多的系统资源
     */
    
    
    //for in 快速遍历
    for (NSString *item in mArray) {
        NSLog(@"%@",item);
    }
    /**
     * 优点：语法简单，使用方便。效率高
     * 缺点：无法方便的获取当前遍历的下标
     *      无法在遍历过程中修改遍历的集合，否则会导致崩溃
     */
    
    //enumerateObjectsUsingBlock 基于块(block)的遍历
    [mArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        //obj表示数组中的元素
        //idx表示元素的下标
        //stop可以控制遍历何时停止，在需要停止时令*stop = YES即可
        NSLog(@"%@",obj);
    }];
    
    //字典遍历
    NSDictionary *dict = @{@"1":@"11", @"2":@"22", @"3":@"33"};
    [dict enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        NSLog(@"key:%@-value:%@",key,obj);
    }];
    
    /**
     * 优点：可以随时停止遍历
     *      直接把字典的key和value都返回给我们
     * 缺点：防止循环引用
     */
    
    //NSEnumerator 基于枚举的遍历
    // NSEnumerationConcurrent 并发遍历
    // NSEnumerationReverse    倒序遍历
    [mArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"%@",obj);
    }];
    
    /**
     * 优点：可并发遍历
     * 缺点：很少使用，使用block,容易循环引用
     */
}


@end
